"""
宿舍内务pro

宿舍内务根据难度分为几个等级，每完成一项任务就可以累计对应等级的分数。等级和分数对应关系如下：
1级：擦桌子、椅子、窗户 - 对应1分
2级：扫地、拖地 - 对应2分
3级：扫厕所 - 对应3分
4级：帮全宿舍打饭 - 对应4分
5级：帮全宿舍签到 - 对应5分

编写一个Python程序，先读取“内务记录.txt”文件，获取所有已填写的信息（字典格式）。
然后让用户输入自己的名字，名字不存在则提示名字错误然后结束程序，如果名字存在，则循环输入自己完成的宿舍内务任务和完成次数。
每次输入结束后，程序会统计并显示用户总共完成每项任务的次数（包括以前的记录）。
如果任务名称不存在则跳出循环，打印用户的总分，并将本次的任务记录更新到 “内务记录.txt” 文件中，程序结束

编程思路提示：
使用with open来操作文件。
读取文件时，将字符串转换回字典。
写入文件前，将字典转换为字符串。
使用循环来接收用户输入的任务和次数。
使用字典来存储和更新任务次数。
输入为空时结束循环，写入文件。
判断key存不存在字典用 if key in dict: 的方式，或者用异常捕获配合 dict[key] 的方式
任务和分数的对应字典用：
    task_scores = {'擦桌子': 1, '擦椅子': 1, '擦窗户': 1, '扫地': 2, '拖地': 2, '扫厕所': 3, '帮全宿舍打饭': 4, '帮全宿舍签到': 5}
"""
import json
from pathlib import Path


class DormTaskManagerPro:
    """高级宿舍内务管理类"""

    # 定义任务等级和分数对应关系
    TASK_SCORES = {
        "擦桌子": 1, "擦椅子": 1, "擦窗户": 1,
        "扫地": 2, "拖地": 2,
        "扫厕所": 3,
        "帮全宿舍打饭": 4,
        "帮全宿舍签到": 5
    }

    def __init__(self, filename="内务记录.txt"):
        """初始化，读取记录文件"""
        self.filename = filename
        self.records = self.load_records()

    def load_records(self):
        """从文件加载所有用户的任务记录"""
        try:
            if Path(self.filename).exists():
                with open(self.filename, 'r', encoding='utf-8') as f:
                    return json.load(f)
            return {}
        except Exception as e:
            print(f"读取文件时出错: {str(e)}")
            return {}

    def save_records(self):
        """保存所有记录到文件"""
        try:
            with open(self.filename, 'w', encoding='utf-8') as f:
                json.dump(self.records, f, ensure_ascii=False, indent=4)
            print("\n记录已成功保存到文件")
        except Exception as e:
            print(f"保存文件时出错: {str(e)}")

    def add_user(self, username):
        """添加新用户"""
        if not username:
            return False
        if username not in self.records:
            self.records[username] = {}
            self.save_records()
            return True
        return False

    def add_task(self, username, task_name, count):
        """添加或更新用户的任务记录"""
        if task_name not in self.TASK_SCORES:
            return False

        # 确保用户的记录存在
        if username not in self.records:
            self.records[username] = {}

        # 更新任务次数
        if task_name in self.records[username]:
            self.records[username][task_name] += count
        else:
            self.records[username][task_name] = count
        return True

    def calculate_user_score(self, username):
        """计算用户的总分"""
        if username not in self.records:
            return 0

        total_score = 0
        for task, count in self.records[username].items():
            if task in self.TASK_SCORES:
                total_score += self.TASK_SCORES[task] * count
        return total_score

    def display_user_summary(self, username):
        """显示用户的任务统计信息"""
        if username not in self.records:
            print(f"\n未找到用户 {username} 的记录")
            return

        print(f"\n{username} 的任务完成统计：")
        print("-" * 40)
        print(f"{'任务名称':<12}{'完成次数':<8}{'单次分数':<8}{'总分':<8}")
        print("-" * 40)

        for task, count in sorted(self.records[username].items()):
            if task in self.TASK_SCORES:
                score = self.TASK_SCORES[task]
                total = score * count
                print(f"{task:<12}{count:<8}{score:<8}{total:<8}")

        print("-" * 40)
        print(f"总分：{self.calculate_user_score(username)}")


def main():
    manager = DormTaskManagerPro()

    # 获取用户名
    username = input("请输入你的名字: ").strip()
    if not username:
        print("错误：名字不能为空")
        return

    # 处理新用户
    if username not in manager.records:
        print(f"用户 {username} 不存在，是否要注册新用户？(y/n)")
        choice = input().strip().lower()
        if choice == 'y':
            if manager.add_user(username):
                print(f"已成功注册用户: {username}")
            else:
                print("注册失败")
                return
        else:
            print("已取消注册")
            return

    print(f"\n欢迎 {username}！")
    print("\n可用的任务列表：")
    for task, score in DormTaskManagerPro.TASK_SCORES.items():
        print(f"{task} - {score}分")

    while True:
        print("\n请输入任务信息：")
        task_name = input("任务名称: ").strip()

        if task_name not in DormTaskManagerPro.TASK_SCORES:
            print("任务名称不存在，程序结束")
            break

        try:
            count = int(input("完成次数: "))
            if count <= 0:
                print("次数必须是正整数")
                continue
        except ValueError:
            print("请输入有效的数字")
            continue

        if manager.add_task(username, task_name, count):
            print(f"已添加: {task_name} x {count}")
            manager.display_user_summary(username)

    # 保存记录并显示最终统计
    manager.save_records()
    print("\n最终统计：")
    manager.display_user_summary(username)


if __name__ == "__main__":
    main()